package com.roc.provider;

import com.roc.common.service.UserService;
import com.roc.demo.RpcApplication;
import com.roc.demo.bootstrap.ProviderBootstrap;
import com.roc.demo.config.RegistryConfig;
import com.roc.demo.config.RpcConfig;
import com.roc.demo.model.ServiceMetaInfo;
import com.roc.demo.model.ServiceRegisterInfo;
import com.roc.demo.registry.LocalRegistry;
import com.roc.demo.registry.Registry;
import com.roc.demo.registry.RegistryFactory;
import com.roc.demo.service.HttpService;
import com.roc.demo.service.VertxHttpServer;
import com.roc.demo.service.tcp.VertxTcpServer;
import com.roc.provider.service.UserServiceImpl;

import java.util.ArrayList;
import java.util.List;

/**
 * 扩展rpc框架 提供者服务示例
 */
public class ProviderExample {

    public static void main(String[] args) {

        /**
         * 注意
         * LocalRegistry用于服务提供者内部，将接口名和实现类关联起来，当收到请求时，根据接口名找到对应的实现类实例。
         * 而注册中心etcd则是用于服务发现，让消费者知道提供者的网络地址，两者的职责不同。
         * 一个管理接口到类的映射，一个管理服务到实例地址的映射。
         * 其实就是etcd中存的是服务的信息，但是要调用服务还是需要用本地存储的类的映射，所以需要注册两次
         */
        //Rpc框架初始化
//        RpcApplication.init();
        // 注册服务
//        String serviceName = UserService.class.getName();
//        LocalRegistry.register(serviceName, UserServiceImpl.class);
        // 注册服务到注册中心
//        RpcConfig rpcConfig = RpcApplication.getRpcConfig();
//        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
//        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
//        ServiceMetaInfo serviceMetaInfo = new ServiceMetaInfo();
//        serviceMetaInfo.setServiceName(serviceName);
//        serviceMetaInfo.setServiceHost(rpcConfig.getServerHost());
//        serviceMetaInfo.setServicePort(rpcConfig.getServerPort());
//        try {
//            registry.register(serviceMetaInfo);
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
        //启动web服务——http协议
////        HttpService httpService = new VertxHttpServer();
////        httpService.doStart(RpcApplication.getRpcConfig().getServerPort());
        //启动tcp服务
//        VertxTcpServer tcpServer = new VertxTcpServer();
//        tcpServer.doStart(RpcApplication.getRpcConfig().getServerPort());

        //使用启动机制和注解驱动
        // 要注册的服务
        List<ServiceRegisterInfo<?>> serviceRegisterInfoList = new ArrayList<>();
        ServiceRegisterInfo<UserService> serviceRegisterInfo = new ServiceRegisterInfo<>(UserService.class.getName(), UserServiceImpl.class);
        serviceRegisterInfoList.add(serviceRegisterInfo);
        // 服务提供者初始化
        ProviderBootstrap.init(serviceRegisterInfoList);
    }
}
